<?php

class EnclosedAttach extends Enclosed
{

    static protected $currentUserId;
    protected $iam_owner;

    function __construct()
    {
        $this->iam_owner = ( self::$currentUserId == $this->owner );

        //solo el administrador y 
        $this->attachable = true;
        $this->editable = $this->iam_owner || ( $this->collaborative == 'S' );
        $this->deletable = $this->iam_owner;
    }

    function handleGET( Event $e )
    {
        if ( $e->tag == 'edit' ) {

            if ( $this->editable ) {

                if ( empty( GSharedAPI::$instances[ 0 ] ) )
                        GSharedAPI::$instances[ 0 ] = new GShareAPI( GOOGLE_ACCOUNT,
                            MyLink::$default );

                $data = GSharedAPI::$instances[ 0 ]->isUploaded( 'enclosed_files/' . $this->project . '/' . $this->id . '.' . $this->revision . '.' . $this->extension );

                if ( empty( $data ) ) {
                    list($object_id, $view_link, $edit_link, $export_link) = $data;
                } else {
                    list($object_id, $view_link, $edit_link, $export_link) = GSharedAPI::$instances[ 0 ]->uploadNewFile( 'enclosed_files/' . $this->project . '/' . $this->id . '.' . $this->revision . '.' . $this->extension,
                            $this->title );
                }

                if ( !empty( $object_id ) && GSharedAPI::$instances[ 0 ]->share( $object_id,
                                GShareAPI::PERMISSION_READER,
                                $_SESSION[ 'google_user_account' ] ) ) {

                    header( 'Location: ' . $edit_link );
                    exit();
                }
                else
                        self::output( 'enclosed_files/' . $this->project . '/' . $this->id . '.' . $this->revision . '.' . $this->extension,
                            true );
                exit();
            }
        }
        else parent::handleGET( $e );
    }

    function doPOST( Event $e )
    {
        if ( $e->tag == 'attach_enclosed' ) {
            //tengo ue obtener el milestone y attachearlo
            if ( $this->attachable ) {
                //Node::getInstance( 'milestone', $this->getParentNode()->$milestoneToAttach )->attach( $this->id );
                $this->getParentNode()->getParentNode()->attach( $this->id );
            }
        } else if ( $e->tag == 'unattach_enclosed' ) {
            if ( $this->attachable ) {
                //Node::getInstance( 'milestone', $this->getParentNode()->$milestoneToAttach )->unattach( $this->id );
                //OJO, aqui está en una lista de enclosed o está en un milestone. ESTO DEBERÍA ESTAR EN UN MILESTONE

                $this->getParentNode()->getParentNode()->unattach( $this->id );
            }
        } else if ( $e->tag == 'delete_enclosed' ) {
            if ( $this->deletable ) {
                MyLink::$default->execute( 'UPDATE encloseds SET active=\'N\' WHERE id=' . $this->id );
            }
        } else if ( $e->tag == 'update_progress' ) {
            //en la primera llamada podría  ponerlo a a descargar el fichero si ha 
            $headers = getallheaders();
            //Tengo que recibir
            //'Content-Range: ' . $bytes_sent . '-' .( $bytes_sent + $this_chuck ) . '/' . $file_size . self::CRLF;
            //tengo que devolver
            //list(  $bytes_begin, $bytes_sent ) = explode( '-', $headers['Range'][0] );
            //$headers['Location'][0];

            if ( empty( GSharedAPI::$instances[ 0 ] ) )
                    GSharedAPI::$instances[ 0 ] = new GShareAPI( GOOGLE_ACCOUNT,
                        MyLink::$default );

            $data = GSharedAPI::$instances[ 0 ]->isUploaded( 'enclosed_files/' . $this->project . '/' . $this->id . '.' . $this->revision . '.' . $this->extension );

            if ( !empty( $data ) ) {

                list($object_id, $view_link, $edit_link, $export_link) = $data;

                $data = GSharedAPI::$instances[ 0 ]->wasModified( $object_id );

                if ( $data !== false ) {

                    //Tambien podría hacer una llamada a una parte pública dónde tenga un script de forma que empezara a descargar el fichero en segundo plano
                    ignore_user_abort( true );
                    set_time_limit( 0 );

                    //estrictamente no tendríamos que esperar a que descargue? siiiii, sino no podemos subir otro

                    if ( GSharedAPI::$instances[ 0 ]->downloadAndUpdate( $object_id,
                                    $data[ 0 ], $data[ 1 ],
                                    'enclosed_files/' . $this->project . '/' . $this->id . '.' . ($this->revision + 1) . '.' . $this->extension ) == 1 ) {

                        MyLink::$default->execute( 'UPDATE encloseds SET revision = revision + 1 WHERE id=' . $this->id );
                        $this->revision++;
                    }
                }
            }

            ///tengo que tener en la base de datos control de como va en curso, por si hay alguno por ahí a medias
            //ahora voy a crear una revision
            //
            //
            //Cada llamada debe devolver cuanto
            $fp = null;
            $size = ( int ) $_GET[ 'file_uploaded_size' ];


            if ( empty( $_GET[ 'file_temp_id' ] ) ) {

                $upload_size = 0;

                if ( $size == 0 ) {

                    $uniqid = uniqid();
                    $fp_out = fopen( TEMP_PATH . self::$currentUserId . '_' . $uniqid,
                            'w' );
                }
            } else {

                $uniqid = $_GET[ 'file_temp_id' ];
                $upload_size = filesize( TEMP_PATH . self::$currentUserId . '_' . $uniqid );

                if ( $upload_size == $size )
                        $fp_out = fopen( TEMP_PATH . self::$currentUserId . '_' . $uniqid,
                            'a' );
            }

            $fp_in = fopen( 'php://input', 'rb' );

            while ( $data = fread( $fp_in, 5120 ) )
                fwrite( $fp_out, $data );


            $upload_size = filesize( TEMP_PATH . self::$currentUserId . '_' . $uniqid );

            //devuelvo el upload_size para que siga subiendo a partir de ahí y el $uniqid;

            if ( $_GET[ 'last_chunck' ] == '1' ) {
                ///$_GET['file_name'];
                //
                //copio el archivo antiguo a una revision
                //elimino el anterior
                //muevo el nuevo al nombre original, si esto no fona sería lo peor que podría pasar ya que quedaría incosistente
                //para ello si no tenemos el 
                //añado en la BBDD la revision
                //por otra banda si tenemos en el nombre del archivo siempre la revision que es 
            }

            $e->cancelBubble();
        } else if ( $e->tag == 'update' ) {


            $e->cancelBubble();
        }
        else parent::doPOST( $e );
    }

    static function setCurrentUserId()
    {
        self::$currentUserId = User::getLogged()->getId();
    }

}

EnclosedAttach::setCurrentUserId();
?>
